from django.shortcuts import render

# # Create your views here.
# ######################上传图片的代码###############
# from fdfs_client.client import Fdfs_client

# #创建客户端对象
# #修改加载配置文件的路径
# client = Fdfs_client('utils/fastdfs/client.conf')
# #上传图片
# client.upload_by_filename('/home/chengdaohu/Desktop/images/fastdfs.jpg')

# # 获取file_id
from django.views import View
from collections import OrderedDict
from apps.goods.models import GoodsChannel

class IndexView(View):
    """首页广告"""

    def get(self, request):
        """提供首页广告界面"""
        # 查询商品频道和分类
        categories = OrderedDict()
        channels = GoodsChannel.objects.order_by('group_id', 'sequence')
        for channel in channels:
            group_id = channel.group_id  # 当前组

            if group_id not in categories:
                categories[group_id] = {'channels': [], 'sub_cats': []}

            cat1 = channel.category  # 当前频道的类别

            # 追加当前频道
            categories[group_id]['channels'].append({
                'id': cat1.id,
                'name': cat1.name,
                'url': channel.url
            })
            # 构建当前类别的子类别
            for cat2 in cat1.subs.all():
                cat2.sub_cats = []
                for cat3 in cat2.subs.all():
                    cat2.sub_cats.append(cat3)
                categories[group_id]['sub_cats'].append(cat2)

    def get_categories():
        """
        提供商品频道和分类
        :return 菜单字典
        """
        # 查询商品频道和分类
        categories = OrderedDict()
        channels = GoodsChannel.objects.order_by('group_id', 'sequence')
        for channel in channels:
            group_id = channel.group_id  # 当前组

            if group_id not in categories:
                categories[group_id] = {'channels': [], 'sub_cats': []}

            cat1 = channel.category  # 当前频道的类别

            # 追加当前频道
            categories[group_id]['channels'].append({
                'id': cat1.id,
                'name': cat1.name,
                'url': channel.url
            })
            # 构建当前类别的子类别
            for cat2 in cat1.subs.all():
                cat2.sub_cats = []
                for cat3 in cat2.subs.all():
                    cat2.sub_cats.append(cat3)
                categories[group_id]['sub_cats'].append(cat2)
        return categories

"""
需求：
        根据点击的分类，来获取分类数据（有排序，有分页）
前端：
        前端会发送一个axios请求， 分类id 在路由中， 
        分页的页码（第几页数据），每页多少条数据，排序也会传递过来
后端：
    请求          接收参数
    业务逻辑       根据需求查询数据，将对象数据转换为字典数据
    响应          JSON

    路由      GET     /list/category_id/skus/
    步骤
        1.接收参数
        2.获取分类id
        3.根据分类id进行分类数据的查询验证
        4.获取面包屑数据
        5.查询分类对应的sku数据，然后排序，然后分页
        6.返回响应
"""

from django.core.paginator import Paginator, EmptyPage
from django.views import View
from apps.goods.models import SKU, GoodsCategory
from django.http import JsonResponse
from utils.goods import get_breadcrumb
class ListView(View):
    """商品列表页"""
    def get(self, request, category_id):
        """提供商品列表页"""
        # 1.接收参数
        # 2.获取分类id
        # 3.根据分类id进行分类数据的查询验证
        # 4.获取面包屑数据
        # 5.查询分类对应的sku数据，然后排序，然后分页
        # 6.返回响应
        # 1.接收参数
        page = request.GET.get('page')
        page_size = request.GET.get('page_size')
        # ordering意思是排序
        ordering = request.GET.get('ordering')
        try:
            # category意思是分类，根据分类id查询分类数据
            category = GoodsCategory.objects.get(id=category_id)
        except GoodsCategory.DoesNotExist:
            return JsonResponse({'code': 400, 'errmsg': '参数缺失'})
        # 获取分类数据
        breadcrumb = get_breadcrumb(category)
        # is_launched=True, 表示商品已上架
        try:
            skus = SKU.objects.filter(category=category, is_launched=True).order_by(ordering)
        except Exception as e:
            return JsonResponse({'code': 400, 'errmsg': '获取mysql数据出错'})
        
        paginator = Paginator(skus, page_size)
         # 获取每页商品数据
        try:
            # 获取当前页码对应的数据
            page_skus = paginator.page(page)
        except EmptyPage:   
            return JsonResponse({'code': 400, 'errmsg': '获取Page数据出错'})   
        # 获取列表页总页数
        total_page = paginator.num_pages
        list = []
        for sku in page_skus:
            list.append({
                'id': sku.id,
                'default_image_url': sku.default_image.url,
                'name': sku.name,
                'price': sku.price
            })
        # 把数据变为 json 发送给前端
        return JsonResponse({
                             'code':0,
                             'errmsg':'ok',
                             'breadcrumb': breadcrumb,
                             'list':list,
                             'count':total_page
                            })
class HotGoodsView(View):
    def get(self, request, category_id):
        """
        获取热销商品
        :param request:
        :param category_id:
        :return:
        """
        try:
            skus= SKU.objects.filter(category_id=category_id, is_launched=True).order_by('-sales')[:2]
        except Exception as e:
            return JsonResponse({'code': 400,
                             'errmsg':'获取热销商品失败'})
        hot_skus = []
        for sku in skus:
            hot_skus.append({
                'id': sku.id,
                'default_image_url': sku.default_image.url,
                'name': sku.name,
                'price': sku.price
            })
        return JsonResponse({'code': 0,
                             'errmsg':'ok',
                             'hot_skus':hot_skus})

# 导入: 
from haystack.views import SearchView
from haystack.query import SearchQuerySet

class MySearchView(View):
    '''自定义搜索视图'''
    def get(self, request):
        """
        处理GET搜索请求
        :param request:
        :return:
        """
        # 获取搜索关键字
        query = request.GET.get('q', '')
        
        if not query:
            return JsonResponse([], safe=False)
        
        # 执行搜索
        sqs = SearchQuerySet().filter(content=query)
        
        # 构建返回数据
        data_list = []
        for result in sqs:
            if result.object:  # 确保对象存在
                try:
                    data_list.append({
                        'id': result.object.id,
                        'name': result.object.name,
                        'price': str(result.object.price),
                        'default_image_url': result.object.default_image.url if result.object.default_image else '',
                        'searchkey': query,
                        'page_size': 1,  # 简化处理
                        'count': sqs.count()
                    })
                except Exception as e:
                    # 如果获取对象信息出错，跳过该项
                    continue
        
        return JsonResponse(data_list, safe=False)
    
"""
需求：
    详情页面
    
    1.分类数据
    2.面包屑
    3.SKU信息
    4.规格信息
    
    
    我们的详情页面也是需要静态化实现的。
    但是我们再讲解静态化之前，应该可以先把 详情页面的数据展示出来

"""
from utils.goods import get_categories
from utils.goods import get_breadcrumb
from utils.goods import get_goods_specs
class DetailView(View):
    """商品详情页"""

    def get(self, request, sku_id):
        """提供商品详情页"""
        # 获取当前sku的信息
        try:
            sku = SKU.objects.get(id=sku_id)
        except SKU.DoesNotExist:
            return render(request, '404.html')

        # 查询商品频道分类
        categories = get_categories()
        # 查询面包屑导航
        breadcrumb = get_breadcrumb(sku.category)
        # 查询SKU规格信息
        goods_specs = get_goods_specs(sku)

        # 渲染页面
        context = {
            'categories':categories,
            'breadcrumb':breadcrumb,
            'sku':sku,
            'specs': goods_specs,
        }
        return render(request, 'detail.html', context)


class DetailAPIView(View):
    """商品详情API视图"""
    
    def get(self, request, sku_id):
        """提供商品详情JSON数据"""
        try:
            sku = SKU.objects.get(id=sku_id)
        except SKU.DoesNotExist:
            return JsonResponse({'code': 404, 'errmsg': '商品不存在'})
        
        # 获取SKU详细信息
        sku_data = {
            'id': sku.id,
            'name': sku.name,
            'caption': sku.caption,
            'price': sku.price,
            'cost_price': sku.cost_price,
            'market_price': sku.market_price,
            'stock': sku.stock,
            'sales': sku.sales,
            'comments': sku.comments,
            'is_launched': sku.is_launched,
            'default_image_url': sku.default_image.url if sku.default_image else '',
            'category_id': sku.category.id,
            'category_name': sku.category.name,
            'spu_id': sku.spu.id,
            'spu_name': sku.spu.name,
        }
        
        # 获取SKU规格信息
        specs = []
        sku_specs = sku.specs.all()
        for spec in sku_specs:
            specs.append({
                'spec_id': spec.spec.id,
                'spec_name': spec.spec.name,
                'option_id': spec.option.id,
                'option_value': spec.option.value,
            })
        
        # 获取SKU图片
        images = []
        sku_images = sku.skuimage_set.all()
        for image in sku_images:
            images.append({
                'id': image.id,
                'image': image.image.url if image.image else '',
            })
        
        # 获取面包屑导航
        breadcrumb = get_breadcrumb(sku.category)
        
        # 返回JSON数据
        return JsonResponse({
            'code': 0,
            'errmsg': 'ok',
            'sku': sku_data,
            'specs': specs,
            'images': images,
            'breadcrumb': breadcrumb,
        })

"""
需求：
    统计每一天的分类商品访问量

前端：
    当访问具体页面的时候，会发送一个axios请求。携带分类id
后端：
    请求：         接收请求，获取参数
    业务逻辑：       查询有没有，有的话更新数据，没有新建数据
    响应：         返回JSON
    
    路由：     POST    detail/visit/<category_id>/
    步骤：
        
        1.接收分类id
        2.验证参数（验证分类id）
        3.查询当天 这个分类的记录有没有
        4. 没有新建数据
        5. 有的话更新数据
        6. 返回响应
    

"""
from apps.goods.models import GoodsVisitCount
from datetime import date
class CategoryVisitCountView(View):

    def post(self,request,category_id):
        # 1.接收分类id
        # 2.验证参数（验证分类id）
        try:
            category=GoodsCategory.objects.get(id=category_id)
        except GoodsCategory.DoesNotExist:
            return JsonResponse({'code':400,'errmsg':'没有此分类'})
        # 3.查询当天 这个分类的记录有没有

        today=date.today()
        try:
            gvc=GoodsVisitCount.objects.get(category=category,date=today)
        except GoodsVisitCount.DoesNotExist:
            # 4. 没有新建数据
            GoodsVisitCount.objects.create(category=category,
                                           date=today,
                                           count=1)
        else:
            # 5. 有的话更新数据
            gvc.count+=1
            gvc.save()
        # 6. 返回响应
        return JsonResponse({'code':0,'errmsg':'ok'})


class CommentView(View):
    """商品评价视图"""
    
    def get(self, request, sku_id):
        """获取商品评价数据"""
        try:
            sku = SKU.objects.get(id=sku_id)
        except SKU.DoesNotExist:
            return JsonResponse({'code': 404, 'errmsg': '商品不存在'})
        
        # 获取商品评价
        # 这里简化处理，实际项目中应该从订单评价表中获取
        comments = []
        # 模拟一些评价数据
        for i in range(5):
            comments.append({
                'username': f'用户{i+1}',
                'score': (i % 5) + 1,
                'comment': f'这是对商品的第{i+1}条评价，商品质量很好，值得购买！',
                'date': '2023-10-2{}'.format(i+1),
            })
        
        return JsonResponse({
            'code': 0,
            'errmsg': 'ok',
            'comments': comments,
        })

